﻿using System;
using System.IO;
using System.Collections.Generic;
using AttachmentModule.Dime;
using System.Xml;
using System.Xml.XPath;
using Coordenadas;
using System.Web.Services.Protocols;
using System.Windows.Forms;


namespace LectorXML
{
    public class XMLCoordenadasSupernova:XMLCoordenadas
    {
        private string url;
        private Central2.Emergencia proxy;
        private List<LatLong> lugares;
        private List<LatLong> carros;

        public XMLCoordenadasSupernova(string url)
        {
            this.url = url;
            this.lugares = new List<LatLong>();
            this.carros = new List<LatLong>();
            this.proxy = new Central2.Emergencia(url);
        }


        /// <summary>
        /// Obtiene las direcciones predeterminadas que existen en la BD
        /// ejm: Metro Grecia (Nunoa/Macul/Penalolen) | -33.469582 | -70.576521
        /// </summary>
        /// <returns>retorna una lista de esas direcciones</returns>
        public List<LatLong> Emergencias()
        {
            XmlNode xn;
            try
            {
                
                xn = String2XmlNode(this.proxy.DireccionesGet());
                
            }
            catch (Exception) {
                try
                {
                    xn = String2XmlNode(this.proxy.DireccionesGet());
                }
                catch (Exception)
                {
                    xn = null;
                    return new List<LatLong>();
                }
            }

            XmlNodeList nl = xn.SelectNodes("//emergencia");
            
            try
            {
                
                for (int i = 0; i < nl.Count; i++)
                {
                    this.lugares.Add(new LatLong(nl[i].SelectSingleNode("lat").InnerText,
                        nl[i].SelectSingleNode("lon").InnerText,
                        nl[i].SelectSingleNode("lugar").InnerText
                        ));
                      
                }
                                

            }
            catch (Exception ex)
            { MessageBox.Show(ex.Message); }
            return this.lugares;
        }

        /// <summary>
        /// Actualiza la posicion de los carro (su latitud y longitud) y luego los recupera
        /// </summary>
        /// <param name="nombre"></param>
        /// <param name="lat"></param>
        /// <param name="lon"></param>
        /// <returns></returns>
        public List<LatLong> CarrosActualiza(string nombre, string lat, string lon)
        {
            XmlNode xn;
            
            try
            {
                //actualiza la posicion 
            
                this.proxy.ActualizarPosicion(nombre, lat, lon);
            
                //recupera nuevamente los carros (con la ultima actualizacion)
            
                xn = String2XmlNode(this.proxy.Carros());
            
            }
            catch (Exception)
            {
                try
                {
                    //actualiza la posicion 
                    this.proxy.ActualizarPosicion(nombre, lat, lon);
                    //recupera nuevamente los carros (con la ultima actualizacion)
                    xn = String2XmlNode(this.proxy.Carros());
                }
                catch (Exception)
                {
                    xn = null;
                    return new List<LatLong>();
                }
            }

            

            if (xn != null)
            {
                this.carros.Clear();

                XmlNodeList listaCarros = xn.SelectNodes("//carro");
                for (int i = 0; i < listaCarros.Count; i++)
                {
                    if (listaCarros[i].SelectNodes("posicion/lat")[0].InnerText != "" && listaCarros[i].SelectNodes("posicion/lat")[0].InnerText != "")
                    {
                        this.carros.Add(new LatLong(
                            double.Parse(listaCarros[i].SelectNodes("posicion/lat")[0].InnerText),
                            double.Parse(listaCarros[i].SelectNodes("posicion/lon")[0].InnerText),
                            listaCarros[i].SelectNodes("nombre")[0].InnerText
                        ));
                    }
                }
            }
            return this.carros;
        }


        public List<LatLong> Carros()
        {
            XmlNode xn;
            try
            {
                xn = String2XmlNode(this.proxy.Carros());
            }
            catch (Exception)
            {
                try
                {
                    xn = String2XmlNode(this.proxy.Carros());
                }
                catch (Exception)
                {
                    xn = null;
                    return new List<LatLong>();
                }
            }
            if (xn != null)
            {
                this.carros.Clear();

                XmlNodeList listaCarros = xn.SelectNodes("//carro");
                for (int i = 0; i < listaCarros.Count; i++)
                {
                    if (listaCarros[i].SelectNodes("posicion/lat")[0].InnerText != "" && listaCarros[i].SelectNodes("posicion/lat")[0].InnerText != "")
                    {
                        this.carros.Add(new LatLong(
                            double.Parse(listaCarros[i].SelectNodes("posicion/lat")[0].InnerText),
                            double.Parse(listaCarros[i].SelectNodes("posicion/lon")[0].InnerText),
                            listaCarros[i].SelectNodes("nombre")[0].InnerText
                        ));
                    }
                }
            }
            return this.carros;
        }

        //---transformar de un texto a XML (en php devuelve en texto)
        private XmlNode String2XmlNode(string _texto)
        {
            XmlDocument tmpXmlNode;
            tmpXmlNode = new XmlDocument();
            tmpXmlNode.LoadXml(_texto);
            return tmpXmlNode;
        }
    }
}
